// 部门信息
const router = require('koa-router')()
const Dept = require('../model/deptSchema.js')
const utils = require('../utils/utils.js')
//设置路由前缀
router.prefix('/depts')

//列表渲染 get 上传 POST 修改PUT或者POST 删除delete或者POST  RESTFUL风格语法
//如果是POST请求 获取前端发送的参数 ctx.request.body
//如果是GET请求 获取前端发送的参数 ctx.request.query
//ctx.body是返回给前端的数据
//方法的后面 第一个参数都是查询条件 第二个参数基本上都是返回条件
//{userPwd:0} 作为返回条件 0代表不返回  1代表返回 {}或者null代表全部返回 'userName userEmail'代表挑选返回
//$inc 自增加  $or或者  $in包含   $all所有



//部门列表查询渲染
router.get('/list', async (ctx) => {
    //解构出前端发送过来的数据
    let { deptName } = ctx.request.query
    try {
        let params = {};
        if (deptName) params.deptName = { $regex: deptName };//$regex 正则表达式模糊查询
        // find方法查询所有数据      lean() 将查询结果转换为普通的 JavaScript 对象，而不是 Mongoose 文档对象
        let rootList = await Dept.find(params).lean()
        //处理时间格式
        rootList.forEach(item => {
            item.createTime = item.createTime.toLocaleString()
            item.updateTime = item.updateTime.toLocaleString()
        })
        //用封装的方法转换成树形结构
        let res = TreeDeptList(rootList)
        //返回给前端
        ctx.body = utils.success(res)
    } catch (error) {
        console.log(error);
    }
})
//部门转换成树形结构函数
function TreeDeptList(data) {
    let result = []//要返回到数组
    let map = {}//声明一个对象做映射关系
    data.forEach(item => {
        map[item._id] = item//把数组里面的对象以_id为键，数组中的对象为值存到map对象中
    })
    data.forEach(item => {
        //item.parentId数组储存父级菜单的id
        let k = item.deptId.slice().pop()//获取parentId数组最后一个元素     k = '646c18e6b170f7b10befe2f5'  || null
        let parent = map[k]//获取map对象中k对应的值 没有则为undefined
        if (parent) {//如果parent有值 则说明有父级关系
            (parent.children || (parent.children = [])).push(item) //如果parent有children，就push，如果没有，就创建一个children数组并push
        } else {
            result.push(item) //如果parent没有值，说明item是一级菜单，直接push到result数组中
        }
    })
    return result//返回树形结构的数组
}
//部门列表新增/编辑
router.post('/operate', async (ctx) => {
    //解构出前端发送过来的数据
    let params = ctx.request.body
    let { deptName, deptId, userName, userEmail, active, _id } = params
    try {
        //判断是否创建
        if (active === 'create') {
            //验证部门名是否填写
            if (!deptName) {
                ctx.body = utils.fail('部门名不能为空')
                return
            }
            //判断部门名是否存在
            let res = await Dept.findOne({ $or: [{ deptName }] }, 'deptName')
            if (res) {
                ctx.body = utils.fail('部门已存在')
                return
            } else {
                //创建部门
                let res = await Dept.create(params)
                ctx.body = utils.success("创建成功")
            }
        } else {
            //编辑部门  findOneAndUpdate()查找并更新单个文档  第一个参数查找,第二个参数更新,第三个参数返回
            let res = await Dept.findOneAndUpdate({ _id }, { deptName })
            ctx.body = utils.success('更新成功')
        }
    } catch (error) {
        console.log(error);
    }
})
//部门列表删除/批量删除
router.post('/delete', async (ctx) => {
    //解构出前端发送过来的数据
    let _id = ctx.request.body
    try {
        //删除  findByIdAndDelete() 根据指定 ID 查找并删除文档   但不会删除child子元素 
        let res = await Dept.findByIdAndDelete(_id)
        //deleteMany() 删除多个文档     $all查询匹配数组中包含所有指定元素的文档
        await Dept.deleteMany({ deptId: { $all: _id } })
        ctx.body = utils.success(`删除成功`)
    } catch (error) {
        console.log(error);
    }
})






module.exports = router
